package com.xiaoshuidi.cloud.module.contract.service.contract;

import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.module.bpm.mq.message.BpmProcessInstanceResultEvent;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.OrderResp;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.rentOrder.RentOrderVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.*;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company.*;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.settlement.ContractCompanyBatchSettlementVO;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.CompanyContractDO;
import com.xiaoshuidi.cloud.module.contract.vo.ApproveReqVO;

import javax.validation.Valid;
import java.time.LocalDate;
import java.util.List;

/**
 * 企业合同 Service 接口
 *
 * @author 合房租赁
 */
public interface CompanyContractService {

    /**
     * 创建企业合同
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCompanyContract( CompanyContractCreateReqVO createReqVO);
    /**
     * 分页查询
     *
     * @param pageReqVO 创建信息
     * @return 编号
     */
    PageResult<CompanyContractListRespVO> pageCompanyContract(CompanyContractPageReqVO pageReqVO);

    /**
     * 通过合同id获取租赁信息
     *
     * @param id 合同id
     * @return 编号
     */
    CompanyContractRentDataRespVO get(Long id);

  /**
     * 导出企业合同
     *
     * @param exportReqVO 创建信息
     * @return 编号
     */
    List<CompanyContractListExcelVO> getExportCompanyContractList( CompanyContractExcelReqVO exportReqVO);

    /**
     * 通过企业客户id获取该客户的所有企业合同
     *
     * @param customerCompanyId 企业客户id
     * @return
     */
    CompanyContractStatusListRespVO getCompanyContractSimpleList(Long customerCompanyId);

    /**
     * 通过企业客户id获取该客户的所有企业合同
     *
     * @param companyContractId  企业合同id
     * @param actualRentOutDate  实际退租日期
     * @return
     */
    List<RentingOutRoomsRespVO> getRoomOrder(Long companyContractId, LocalDate actualRentOutDate);

    /**
     * 创建企业合同-续租
     */
    void createRenewalContractCompany( CompanyContractRenewalReqVO reqVO);

    /**
     * 企业ID查询合同
     * @param customerCompanyId 企业客户ID
     * @param type 类型 0审批中 1已生效 2续租 3已驳回 4退租 5已到期
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company.CompanyContractSimpleListRespVO>
     */
    List<CompanyContractSimpleListRespVO> getCompanyContractByCompanyId(Long customerCompanyId, Integer type);

    /**
     * 子账单ID查询企业合同信息
     * @param subContractId
     * @return: com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.CompanyContractDO
     */
    CompanyContractDO getCompanyContractBySubContractId(Long subContractId);

  /**
   * 创建企业退租
   */
  void createCompanyRefund(CompanyContractRefundReqVO reqVO);

  /**
   * 创建企业退租
   *
   * @param reqVO
   */
  void createCompanyRefund(ContractRefundReqVO reqVO);


  /**
   * 企业批量审批回调
   *
   * @param event
   */
  void approvalResult(BpmProcessInstanceResultEvent event);

  /**
   * 企业合同编号查询企业合同信息
   *
   * @param companyContractId
   * @return: com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company.CompanyContractRentDataRespVO
   */
  CompanyContractRentDataRespVO getByCompanyContractId(Long companyContractId);

  List<CompanyContractRoomsVO> getCompanyRooms(Long companyContractId);

    /**
     * 子合同续租
     *
     * @param createReqVO 续租参数
     * @return 编号
     */
    void createRenewalContractCompanySub(ContractRenewalReqVO createReqVO);

    /**
     * 创建子合同审批后操作
     * @param reqVO
     */
    void createSubContractAndStatus(ApproveReqVO reqVO);

    CompanyContractDO getById(Long id);

    /**
     * 续约、退租子合同审批后操作
     * @param reqVO
     */
    void updateContractStatus(ApproveReqVO reqVO);

    void createRefund(ContractRefundReqVO reqVO, Boolean flag);

    /**
     * 判断是否是最后一个企业自合同，更改大合同状态
     * @param companyContractId 企业合同id
     * @param status 合同节点
     */
    void setCompanyStatus(Long companyContractId,String status);

    ContractTenantInformationRepVO getRentByContractId(Long id);

  /**
   * 获取企业合同可以续租的房间列表
   * @param companyContractId
   */
    List<CompanyContractRoomsVO> getCompanyRenewalRooms(Long companyContractId);

  /**
   * 企业合同批量续租审批结束更改合同状态
   * @param approveReqVO
   */
  void batchRenewalCompanyContract(ApproveReqVO approveReqVO);

  OrderResp getBillPreview(RentOrderVO rentOrderVO);

  OrderResp getNewBillPreview(RentOrderVO rentOrderVO);

  /**
   * 企业合同取消
   *
   * @param id 企业合同号
   * @return: void
   */
  void cancelSigning(Long id);

  /**
   * 通过清算单id获取企业合同批量退租清单列表
   *
   * @param id
   * @return {@link ContractCompanyBatchSettlementVO}
   */
  ContractCompanyBatchSettlementVO getCompnayBatchSettlementById(Long id);

}
